// 用户路由模块

// 加载模块
const express = require('express')
const usersModel = require('../db/usersModel.js')
const jwt = require('jsonwebtoken')
const fs = require('fs')
const mail = require('../utils/mail.js')

// 创建路由表（空表）
const router = express.Router()

// 向路由表添加内容：

/**
* @api {get} /users/islogin 判断是否登录
* @apiGroup users
*
* @apiParam {String} authorization 请求头携带token参数
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "已登录",
*     "data": {用户信息}
* }
*/
router.get('/islogin',(req,res)=>{
    // 获取前端携带过来的token（在请求头中携带）
    let token = req.headers.authorization

    // 验证token
    jwt.verify(token,'hehe123',(err,payload)=>{
        if (err) {// token验证失败
            res.send({"code":0,"msg":"未登录"})
        } else {// token验证成功
            res.send({"code":1,"msg":"已登录","data":payload})
        }
    })
})


/**
* @api {post} /users/login 登录
* @apiGroup users
*
* @apiParam {String} user 用户账号
* @apiParam {String} pass 用户密码
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "登录成功",
*     "token": "sdf34ad.5a6d5d6.adsfadad"
* }
*/
router.post('/login',(req,res)=>{
    console.log( req.session )// {session data} 

    // 获取参数并解构赋值
    let {user,pass} = req.body

    // 查询数据库验证账号密码
    usersModel.find({$and:[{user},{pass}]})
    .then((arr)=>{
        if (arr.length > 0) {
            // 要存储的用户信息
            let info = {
                "user": arr[0].user,
                "nickname": arr[0].nickname,
                "sex": arr[0].sex
            }

            // 生成token
            let token = jwt.sign(info,'hehe123',{"expiresIn":60*30})

            res.send({"code":1,"msg":"登录成功","token":token})
        } else {
            res.send({"code":0,"msg":"登录失败"})
        }
    })
})

// 缓存邮箱验证码
let cache = {
    // '2239222721@qq.com': '88390',
    // '223927777@qq.com': '24225'
}

/**
* @api {post} /users/register 注册
* @apiGroup users
*
* @apiParam {String} user 用户账号
* @apiParam {String} pass 用户密码
* @apiParam {String} email 用户邮箱
* @apiParam {String} nickname 用户昵称
* @apiParam {String} sex 用户性别
* @apiParam {String} age 用户年龄
* @apiParam {String} code 注册验证码
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "注册成功"
* }
*/
router.post('/register',(req,res)=>{
    // 获取参数并解构赋值
    let {user,pass,email,nickname,sex,age,code} = req.body

    // 校验注册验证码
    if (cache[email] !== code) {
        return res.send({"code":-3,"msg":"注册验证码错误"})
    }

    // 查询数据库（看是否可注册）
    usersModel.find({user})
    .then((arr)=>{
        if (arr.length === 0) {
            // 数据库没有该账号,可以注册(添加一条数据)
            return usersModel.insertMany({user,pass,email,nickname,sex,age})
        } else {
            // 数据库有该账号,不可以注册
            res.send({"code":-1,"msg":"账号已存在"})
            // 终止链式调用
            return new Promise(()=>{})
        }
    })
    .then((arr)=>{
        if (arr.length > 0) {
            res.send({"code":1,"msg":"注册成功"})
        } else {
            res.send({"code":0,"msg":"注册失败"})
        }
    })
    .catch((err)=>{
        res.send({"code":-2,"msg":err})
    })
})

/**
* @api {post} /users/sendmail 发送验证码
* @apiGroup users
*
* @apiParam {String} email 用户邮箱
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "验证码发送成功"
* }
*/
router.post('/sendmail',(req,res)=>{
    // 接收参数
    let {email} = req.body
    // 验证邮箱格式 zhangsanfeng_123@sohu.com.cn  99835555@qq.com
    let reg = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/
    if (!reg.test(email)) {
        return res.send({"code":-1,"msg":"邮箱格式错误"})
    }
    // 生成随机验证码
    let code = parseInt(Math.random()*1000000)
    // 发送邮件验证码
    mail.sendMail(email,'注册验证码','您的验证码是：'+code)
    .then((result)=>{
        // 缓存邮箱验证码
        cache[email] = code+''

        res.send({"code":1,"msg":result})
    })
    .catch((err)=>{
        res.send({"code":0,"msg":err})
    })
})

// 获取所有用户接口: http://localhost:8080/users/list
router.get('/list',(req,res)=>{
    // 获取参数并解构赋值
    let {a,b} = req.query
    console.log( a,b )

    // 查询数据库
    usersModel.find()
    .then((arr)=>{
        // 响应前端
        res.send(arr)
    })
    .catch((err)=>{
        // 响应前端
        res.send({"code":0,"msg":err})
    })
})

// 导出路由表
module.exports = router
